package com.ks.api.utils;

import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.ks.api.service.KuaishouTokenService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

/**
 * 快手API工具类
 */
@Slf4j
@Component
@RequiredArgsConstructor
public class KuaishouApiUtils {

    private final KuaishouTokenService kuaishouTokenService;
    
    @Value("${kuaishou.miniapp.default_app_id}")
    private String defaultAppId;
    
    /**
     * 发送GET请求到快手API（使用Bearer Token认证）
     *
     * @param url 请求URL
     * @return 响应JSON对象
     */
    public JSONObject sendGetRequest(String url) {
        return sendRequest(url, null, "GET", true, defaultAppId);
    }
    
    /**
     * 发送GET请求到快手API（使用Bearer Token认证）并指定AppID
     *
     * @param url 请求URL
     * @param appId 应用ID
     * @return 响应JSON对象
     */
    public JSONObject sendGetRequest(String url, String appId) {
        return sendRequest(url, null, "GET", true, appId);
    }
    
    /**
     * 发送POST请求到快手API（使用Bearer Token认证）
     *
     * @param url 请求URL
     * @param params 请求参数
     * @return 响应JSON对象
     */
    public JSONObject sendPostRequest(String url, JSONObject params) {
        return sendRequest(url, params, "POST", true, defaultAppId);
    }
    
    /**
     * 发送POST请求到快手API（使用Bearer Token认证）并指定AppID
     *
     * @param url 请求URL
     * @param params 请求参数
     * @param appId 应用ID
     * @return 响应JSON对象
     */
    public JSONObject sendPostRequest(String url, JSONObject params, String appId) {
        return sendRequest(url, params, "POST", true, appId);
    }
    
    /**
     * 发送GET请求到快手API（使用Access-Token头认证）
     *
     * @param url 请求URL
     * @return 响应JSON对象
     */
    public JSONObject sendGetRequestWithAccessToken(String url) {
        return sendRequest(url, null, "GET", false, defaultAppId);
    }
    
    /**
     * 发送GET请求到快手API（使用Access-Token头认证）并指定AppID
     *
     * @param url 请求URL
     * @param appId 应用ID
     * @return 响应JSON对象
     */
    public JSONObject sendGetRequestWithAccessToken(String url, String appId) {
        return sendRequest(url, null, "GET", false, appId);
    }
    
    /**
     * 发送POST请求到快手API（使用Access-Token头认证）
     *
     * @param url 请求URL
     * @param params 请求参数
     * @return 响应JSON对象
     */
    public JSONObject sendPostRequestWithAccessToken(String url, JSONObject params) {
        return sendRequest(url, params, "POST", false, defaultAppId);
    }
    
    /**
     * 发送POST请求到快手API（使用Access-Token头认证）并指定AppID
     *
     * @param url 请求URL
     * @param params 请求参数
     * @param appId 应用ID
     * @return 响应JSON对象
     */
    public JSONObject sendPostRequestWithAccessToken(String url, JSONObject params, String appId) {
        return sendRequest(url, params, "POST", false, appId);
    }
    
    /**
     * 发送请求到快手API
     *
     * @param url 请求URL
     * @param params 请求参数
     * @param method 请求方法（GET/POST）
     * @param useBearerToken 是否使用Bearer Token格式认证（false则使用Access-Token头）
     * @param appId 应用ID
     * @return 响应JSON对象
     */
    private JSONObject sendRequest(String url, JSONObject params, String method, boolean useBearerToken, String appId) {
        try {
            String accessToken = kuaishouTokenService.getAccessToken(appId);
            
            HttpRequest request;
            if ("GET".equalsIgnoreCase(method)) {
                request = HttpRequest.get(url);
            } else {
                request = HttpRequest.post(url);
                if (params != null) {
                    request.body(params.toString());
                }
            }
            
            // 添加授权头和内容类型
            if (useBearerToken) {
                request.header("Access-Token", accessToken);
            } else {
                request.header("Access-Token", accessToken);
            }
            
            request.header("Content-Type", "application/json");
            
            // 发送请求
            HttpResponse response = request.execute();
            String respBody = response.body();
            
            //log.debug("快手API响应: {}", respBody);
            
            // 解析响应
            JSONObject result = JSONUtil.parseObj(respBody);
            
            // 检查是否需要刷新token
            if (result.getInt("code", -1) == 40001) {
                log.warn("App ID={}的Token已过期，尝试刷新Token", appId);
                kuaishouTokenService.refreshToken(appId);
                
                // 使用新token重试请求
                return sendRequest(url, params, method, useBearerToken, appId);
            }
            
            return result;
        } catch (Exception e) {
            log.error("发送请求到快手API失败: {}, appId: {}", url, appId, e);
            JSONObject errorResult = new JSONObject();
            errorResult.set("code", -1);
            errorResult.set("message", "API请求异常: " + e.getMessage());
            return errorResult;
        }
    }
} 